/*! Verify-v0.1.0 MIT License by 大熊*/

;(function ($, window, document, undefined) {
  //定义Code的构造函数
  var Code = function (ele, opt) {
    ;(this.$element = ele),
      (this.defaults = {
        type: 1,
        figure: 100, //位数，仅在type=2时生效
        arith: 0, //算法，支持加减乘，0为随机，仅在type=2时生效
        width: '200px',
        height: '60px',
        fontSize: '30px',
        codeLength: 6,
        btnId: 'check-btn',
        ready: function () {},
        success: function () {},
        error: function () {}
      }),
      (this.options = $.extend({}, this.defaults, opt))
  }

  var _code_chars = [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    'a',
    'b',
    'c',
    'd',
    'e',
    'f',
    'g',
    'h',
    'i',
    'j',
    'k',
    'l',
    'm',
    'n',
    'o',
    'p',
    'q',
    'r',
    's',
    't',
    'u',
    'v',
    'w',
    'x',
    'y',
    'z',
    'A',
    'B',
    'C',
    'D',
    'E',
    'F',
    'G',
    'H',
    'I',
    'J',
    'K',
    'L',
    'M',
    'N',
    'O',
    'P',
    'Q',
    'R',
    'S',
    'T',
    'U',
    'V',
    'W',
    'X',
    'Y',
    'Z'
  ]
  var _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0']
  var _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC']

  //定义Code的方法
  Code.prototype = {
    init: function () {
      var _this = this

      this.loadDom()
      this.setCode()

      this.options.ready()

      this.$element[0].onselectstart = document.body.ondrag = function () {
        return false
      }

      //点击验证码
      this.$element.find('.verify-code, .verify-change-code').on('click', function () {
        _this.setCode()
      })

      //确定的点击事件
      this.htmlDoms.code_btn.on('click', function () {
        _this.checkCode()
      })
    },

    //加载页面
    loadDom: function () {
      var panelHtml = '<div class="cerify-code-panel"><div class="verify-code"></div><div class="verify-code-area"><div class="verify-input-area"><input type="text" class="varify-input-code" /></div><div class="verify-change-area"><a class="verify-change-code">换一张</a></div></div></div>'
      this.$element.append(panelHtml)

      this.htmlDoms = {
        code_btn: $('#' + this.options.btnId),
        code: this.$element.find('.verify-code'),
        code_area: this.$element.find('.verify-code-area'),
        code_input: this.$element.find('.varify-input-code')
      }

      this.htmlDoms.code.css({ width: this.options.width, height: this.options.height, 'line-height': this.options.height, 'font-size': this.options.fontSize })
      this.htmlDoms.code_area.css({ width: this.options.width })
    },

    //设置验证码
    setCode: function () {
      var color1Num = Math.floor(Math.random() * 3)
      var color2Num = Math.floor(Math.random() * 5)

      this.htmlDoms.code.css({ 'background-color': _code_color1[color1Num], color: _code_color2[color2Num] })
      this.htmlDoms.code_input.val('')

      var code = ''
      this.code_chose = ''

      if (this.options.type == 1) {
        //普通验证码
        for (var i = 0; i < this.options.codeLength; i++) {
          var charNum = Math.floor(Math.random() * 52)
          var tmpStyle = charNum % 2 == 0 ? 'font-style:italic;margin-right: 10px;' : 'font-weight:bolder;'
          tmpStyle += Math.floor(Math.random() * 2) == 1 ? 'font-weight:bolder;' : ''

          this.code_chose += _code_chars[charNum]
          code += '<font style="' + tmpStyle + '">' + _code_chars[charNum] + '</font>'
        }
      } else {
        //算法验证码

        var num1 = Math.floor(Math.random() * this.options.figure)
        var num2 = Math.floor(Math.random() * this.options.figure)

        if (this.options.arith == 0) {
          var tmparith = Math.floor(Math.random() * 3)
        }

        switch (tmparith) {
          case 1:
            this.code_chose = parseInt(num1) + parseInt(num2)
            code = num1 + ' + ' + num2 + ' = ?'
            break
          case 2:
            if (parseInt(num1) < parseInt(num2)) {
              var tmpnum = num1
              num1 = num2
              num2 = tmpnum
            }
            this.code_chose = parseInt(num1) - parseInt(num2)
            code = num1 + ' - ' + num2 + ' = ?'
            break
          default:
            this.code_chose = parseInt(num1) * parseInt(num2)
            code = num1 + ' × ' + num2 + ' = ?'
            break
        }
      }

      this.htmlDoms.code.html(code)
    },

    //比对验证码
    checkCode: function () {
      if (this.options.type == 1) {
        //普通验证码
        var own_input = this.htmlDoms.code_input.val().toUpperCase()
        this.code_chose = this.code_chose.toUpperCase()
      } else {
        var own_input = this.htmlDoms.code_input.val()
      }

      if (own_input == this.code_chose) {
        this.options.success()
      } else {
        this.options.error()
        this.setCode()
      }
    }
  }

  //定义Slide的构造函数
  var Slide = function (ele, opt) {
    ;(this.$element = ele),
      (this.defaults = {
        type: 1,
        vOffset: 5,
        vSpace: 5,
        imgName: ['1.jpg', '2.jpg'],
        imgSize: {
          width: '400px',
          height: '200px'
        },
        blockSize: {
          width: '50px',
          height: '50px'
        },
        barSize: {
          width: '400px',
          height: '40px'
        },
        ready: function () {},
        success: function () {},
        error: function () {}
      }),
      (this.options = $.extend({}, this.defaults, opt))
  }

  //定义Slide的方法
  Slide.prototype = {
    init: function () {
      var _this = this

      //加载页面
      this.loadDom()
      this.options.ready()

      this.$element[0].onselectstart = document.body.ondrag = function () {
        return false
      }

      //按下
      this.htmlDoms.move_block.on('touchstart', function (e) {
        _this.start(e)
      })

      this.htmlDoms.move_block.on('mousedown', function (e) {
        _this.start(e)
      })

      //拖动
      window.addEventListener('touchmove', function (e) {
        _this.move(e)
      })
      window.addEventListener('mousemove', function (e) {
        _this.move(e)
      })

      //鼠标松开
      window.addEventListener('touchend', function () {
        _this.end()
      })
      window.addEventListener('mouseup', function () {
        _this.end()
      })

      //刷新
      _this.$element.find('.verify-refresh').on('click', function () {
        _this.refresh()
      })
    },

    //初始化加载
    loadDom: function () {
      this.img_rand = Math.floor(Math.random() * this.options.imgName.length) //随机的背景图片

      var panelHtml = ''
      var tmpHtml = ''

      if (this.options.type != 1) {
        //图片滑动
        panelHtml += '<div class="verify-img-panel" id="verify-img-panel"><div  class="verify-refresh"><i class="iconfont icon-refresh"></i></div><div class="verify-gap"></div></div>'
        tmpHtml = '<div  class="verify-sub-block" id="verify-sub-block"></div>'
      }

      panelHtml += '<div class="verify-bar-area"><span  class="verify-msg">向右滑动完成验证</span><div class="verify-left-bar"><span  class="verify-msg"></span><div  class="verify-move-block"><i  class="verify-icon iconfont icon-right"></i>' + tmpHtml + '</div></div></div>'
      this.$element.append(panelHtml)

      this.htmlDoms = {
        gap: this.$element.find('.verify-gap'),
        sub_block: this.$element.find('.verify-sub-block'),
        img_panel: this.$element.find('.verify-img-panel'),
        bar_area: this.$element.find('.verify-bar-area'),
        move_block: this.$element.find('.verify-move-block'),
        left_bar: this.$element.find('.verify-left-bar'),
        msg: this.$element.find('.verify-msg'),
        icon: this.$element.find('.verify-icon'),
        refresh: this.$element.find('.verify-refresh')
      }

      this.status = false //鼠标状态
      this.setSize = this.resetSize(this) //重新设置宽度高度

      this.htmlDoms.gap.css({ width: this.options.blockSize.width, height: this.options.blockSize.height })
      this.htmlDoms.sub_block.css({ width: this.options.blockSize.width, height: this.options.blockSize.height })
      this.htmlDoms.img_panel.css({ width: this.setSize.img_width, height: this.setSize.img_height, background: 'url(img/' + this.options.imgName[this.img_rand] + ')', 'background-size': this.setSize.img_width + ' ' + this.setSize.img_height })
      this.htmlDoms.bar_area.css({ width: this.setSize.bar_width, height: this.options.barSize.height, 'line-height': this.options.barSize.height })
      this.htmlDoms.move_block.css({ width: this.options.barSize.height, height: this.options.barSize.height })
      this.htmlDoms.left_bar.css({ width: this.options.barSize.height, height: this.options.barSize.height })
      this.randSet()
    },

    //鼠标按下
    start: function (e) {
      this.htmlDoms.msg.text('')
      this.htmlDoms.move_block.css('background-color', '#337ab7')
      this.htmlDoms.left_bar.css('border-color', '#337AB7')
      this.htmlDoms.icon.css('color', '#fff')
      $('#verify-img-panel').fadeIn(500)
      $('#verify-sub-block').fadeIn(500)
      $('#verify-img-panel').css('margin-top', '-207px')
      e.stopPropagation()
      this.status = true
    },

    //鼠标移动
    move: function (e) {
      if (this.status) {
        if (!e.touches) {
          //兼容移动端
          var x = e.clientX
        } else {
          //兼容PC端
          var x = e.touches[0].pageX
        }
        var bar_area_left = Slide.prototype.getLeft(this.htmlDoms.bar_area[0])
        var move_block_left = x - bar_area_left //小方块相对于父元素的left值

        if (this.options.type != 1) {
          //图片滑动
          if (move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width) / 2) - 2) {
            move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.blockSize.width) / 2) - 2
          }
        } else {
          //普通滑动
          if (move_block_left >= this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height) / 2) + 3) {
            this.$element.find('.verify-msg:eq(1)').text('松开验证')
            move_block_left = this.htmlDoms.bar_area[0].offsetWidth - parseInt(parseInt(this.options.barSize.height) / 2) + 3
          } else {
            this.$element.find('.verify-msg:eq(1)').text('')
          }
        }

        if (move_block_left <= 0) {
          move_block_left = parseInt(parseInt(this.options.blockSize.width) / 2)
        }

        //拖动后小方块的left值
        this.htmlDoms.move_block.css('left', move_block_left - parseInt(parseInt(this.options.blockSize.width) / 2) + 'px')
        this.htmlDoms.left_bar.css('width', move_block_left - parseInt(parseInt(this.options.blockSize.width) / 2) + 'px')
      }
    },

    //鼠标松开
    end: function () {
      var _this = this

      //判断是否重合
      if (this.status) {
        if (this.options.type != 1) {
          //图片滑动

          var vOffset = parseInt(this.options.vOffset)
          if (parseInt(this.htmlDoms.gap.css('left')) >= parseInt(this.htmlDoms.move_block.css('left')) - vOffset && parseInt(this.htmlDoms.gap.css('left')) <= parseInt(this.htmlDoms.move_block.css('left')) + vOffset) {
            this.htmlDoms.move_block.css('background-color', '#5cb85c')
            this.htmlDoms.left_bar.css({ 'border-color': '#5cb85c', 'background-color': 'rgba(76,174,76,.1)' })
            this.htmlDoms.icon.css('color', '#fff')
            this.htmlDoms.icon.removeClass('icon-right')
            this.htmlDoms.icon.addClass('icon-check')
            this.htmlDoms.refresh.hide()
            this.htmlDoms.move_block.unbind('mousedown touchstart')
            this.options.success()
          } else {
            this.htmlDoms.move_block.css('background-color', '#d9534f')
            this.htmlDoms.left_bar.css('border-color', '#d9534f')
            this.htmlDoms.icon.css('color', '#fff')
            this.htmlDoms.icon.removeClass('icon-right')
            this.htmlDoms.icon.addClass('icon-close')

            setTimeout(function () {
              _this.htmlDoms.move_block.animate({ left: '0px' }, 'fast')
              _this.htmlDoms.left_bar.animate({ width: '40px' }, 'fast')
              _this.htmlDoms.left_bar.css({ 'border-color': '#ddd' })

              _this.htmlDoms.move_block.css('background-color', '#fff')
              _this.htmlDoms.icon.css('color', '#000')
              _this.htmlDoms.icon.removeClass('icon-close')
              _this.htmlDoms.icon.addClass('icon-right')
              _this.$element.find('.verify-msg:eq(0)').text('向右滑动完成验证')
            }, 400)

            this.options.error()
          }
        } else {
          //普通滑动

          if (parseInt(this.htmlDoms.move_block.css('left')) >= parseInt(this.setSize.bar_width) - parseInt(this.options.barSize.height) - parseInt(this.options.vOffset)) {
            this.htmlDoms.move_block.css('background-color', '#5cb85c')
            this.htmlDoms.left_bar.css({ color: '#4cae4c', 'border-color': '#5cb85c', 'background-color': '#fff' })
            this.htmlDoms.icon.css('color', '#fff')
            this.htmlDoms.icon.removeClass('icon-right')
            this.htmlDoms.icon.addClass('icon-check')
            this.htmlDoms.refresh.hide()
            this.htmlDoms.move_block.unbind('mousedown')
            this.htmlDoms.move_block.unbind('touchstart')
            this.$element.find('.verify-msg:eq(1)').text('验证成功')
            this.options.success()
          } else {
            this.htmlDoms.move_block.css('background-color', '#d9534f')
            this.htmlDoms.left_bar.css('border-color', '#d9534f')
            this.htmlDoms.icon.css('color', '#fff')
            this.htmlDoms.icon.removeClass('icon-right')
            this.htmlDoms.icon.addClass('icon-close')

            setTimeout(function () {
              _this.htmlDoms.move_block.animate({ left: '0px' }, 'fast')
              _this.htmlDoms.left_bar.animate({ width: '40px' }, 'fast')
              _this.htmlDoms.left_bar.css({ 'border-color': '#ddd' })

              _this.htmlDoms.move_block.css('background-color', '#fff')
              _this.htmlDoms.icon.css('color', '#000')
              _this.htmlDoms.icon.removeClass('icon-close')
              _this.htmlDoms.icon.addClass('icon-right')
              _this.$element.find('.verify-msg:eq(0)').text('向右滑动解锁')
            }, 400)

            this.options.error()
          }
        }
        setTimeout("$('#verify-img-panel').fadeOut(500);", 600)
        setTimeout("$('#verify-sub-block').fadeOut(500);", 600)
        this.status = false
      }
    },

    resetSize: function (obj) {
      var img_width, img_height, bar_width, bar_height //图片的宽度、高度，移动条的宽度、高度
      var parentWidth = obj.$element.parent().width() || $(window).width()
      var parentHeight = obj.$element.parent().height() || $(window).height()

      if (obj.options.imgSize.width.indexOf('%') != -1) {
        img_width = (parseInt(obj.options.imgSize.width) / 100) * parentWidth + 'px'
      } else {
        img_width = obj.options.imgSize.width
      }

      if (obj.options.imgSize.height.indexOf('%') != -1) {
        img_height = (parseInt(obj.options.imgSize.height) / 100) * parentHeight + 'px'
      } else {
        img_height = obj.options.imgSize.height
      }

      if (obj.options.barSize.width.indexOf('%') != -1) {
        bar_width = (parseInt(obj.options.barSize.width) / 100) * parentWidth + 'px'
      } else {
        bar_width = obj.options.barSize.width
      }

      if (obj.options.barSize.height.indexOf('%') != -1) {
        bar_height = (parseInt(obj.options.barSize.height) / 100) * parentHeight + 'px'
      } else {
        bar_height = obj.options.barSize.height
      }

      return { img_width: img_width, img_height: img_height, bar_width: bar_width, bar_height: bar_height }
    },

    //随机出生点位
    randSet: function () {
      var rand1 = Math.floor(Math.random() * 9 + 1)
      var rand2 = Math.floor(Math.random() * 9 + 1)
      var top = (rand1 * parseInt(this.setSize.img_height)) / 15 + parseInt(this.setSize.img_height) * 0.1
      var left = (rand2 * parseInt(this.setSize.img_width)) / 15 + parseInt(this.setSize.img_width) * 0.1

      this.$element.find('.verify-img-panel').css('margin-bottom', this.options.vSpace + 'px')
      this.$element.find('.verify-gap').css({ top: top, left: left })
      this.$element
        .find('.verify-sub-block')
        .css({
          top: '-' + (parseInt(this.setSize.img_height) - top + this.options.vSpace + 2) + 'px',
          'background-image': 'url(img/' + this.options.imgName[this.img_rand] + ')',
          'background-size': this.setSize.img_width + ' ' + this.setSize.img_height,
          'background-position-y': '-' + top + 'px',
          'background-position-x': '-' + left + 'px'
        })
    },

    //刷新
    refresh: function () {
      this.randSet()
      this.img_rand = Math.floor(Math.random() * this.options.imgName.length) //随机的背景图片
      this.$element.find('.verify-img-panel').css({ background: 'url(img/' + this.options.imgName[this.img_rand] + ')', 'background-size': this.setSize.img_width + ' ' + this.setSize.img_height })
      this.$element.find('.verify-sub-block').css({ 'background-image': 'url(img/' + this.options.imgName[this.img_rand] + ')', 'background-size': this.setSize.img_width + ' ' + this.setSize.img_height })
    },

    //获取left值
    getLeft: function (node) {
      var left = $(node).offset().left
      //          var nowPos = node.offsetParent;
      //
      //          while(nowPos != null) {
      //              left += $(nowPos).offset().left;
      //              nowPos = nowPos.offsetParent;
      //          }
      return left
    }
  }

  //定义Points的构造函数
  var Points = function (ele, opt) {
    ;(this.$element = ele),
      (this.defaults = {
        defaultNum: 4, //默认的文字数量
        checkNum: 3, //校对的文字数量
        vSpace: 5, //间隔
        imgName: ['1.jpg', '2.jpg'],
        imgSize: {
          width: '400px',
          height: '200px'
        },
        barSize: {
          width: '400px',
          height: '40px'
        },
        ready: function () {},
        success: function () {},
        error: function () {}
      }),
      (this.options = $.extend({}, this.defaults, opt))
  }

  //定义Points的方法
  Points.prototype = {
    init: function () {
      var _this = this

      //加载页面
      _this.loadDom()

      _this.refresh()
      _this.options.ready()

      this.$element[0].onselectstart = document.body.ondrag = function () {
        return false
      }

      //点击事件比对
      _this.$element.find('.verify-img-panel canvas').on('click', function (e) {
        _this.checkPosArr.push(_this.getMousePos(this, e))

        if (_this.num == _this.options.checkNum) {
          _this.num = _this.createPoint(_this.getMousePos(this, e))
          setTimeout(function () {
            var flag = _this.comparePos(_this.fontPos, _this.checkPosArr)

            if (flag == false) {
              //验证失败

              _this.options.error()
              _this.$element.find('.verify-bar-area').css({ color: '#d9534f', 'border-color': '#d9534f' })
              _this.$element.find('.verify-msg').text('验证失败')

              setTimeout(function () {
                _this.$element.find('.verify-bar-area').css({ color: '#000', 'border-color': '#ddd' })
                _this.refresh()
              }, 400)
            } else {
              //验证成功
              _this.$element.find('.verify-bar-area').css({ color: '#4cae4c', 'border-color': '#5cb85c' })
              _this.$element.find('.verify-msg').text('验证成功')
              _this.$element.find('.verify-refresh').hide()
              _this.$element.find('.verify-img-panel').unbind('click')
              _this.options.success()
            }
          }, 400)
        }

        if (_this.num < _this.options.checkNum) {
          _this.num = _this.createPoint(_this.getMousePos(this, e))
        }
      })

      //刷新
      _this.$element.find('.verify-refresh').on('click', function () {
        _this.refresh()
      })
    },

    //加载页面
    loadDom: function () {
      this.fontPos = [] //选中的坐标信息
      this.checkPosArr = [] //用户点击的坐标
      this.num = 1 //点击的记数
      this.img_rand = Math.floor(Math.random() * this.options.imgName.length) //随机的背景图片

      var panelHtml = ''
      var tmpHtml = ''

      this.setSize = Slide.prototype.resetSize(this) //重新设置宽度高度

      panelHtml +=
        '<div class="verify-img-panel"><div  class="verify-refresh" style="z-index:9999"><i class="iconfont icon-refresh"></i></div><canvas width="' +
        this.setSize.img_width +
        '" height="' +
        this.setSize.img_height +
        '"></canvas></div><div class="verify-bar-area"><span  class="verify-msg"></span></div>'

      this.$element.append(panelHtml)

      this.htmlDoms = {
        img_panel: this.$element.find('.verify-img-panel'),
        bar_area: this.$element.find('.verify-bar-area'),
        msg: this.$element.find('.verify-msg')
      }

      this.htmlDoms.img_panel.css({ width: this.setSize.img_width, height: this.setSize.img_height, 'background-size': this.setSize.img_width + ' ' + this.setSize.img_height, 'margin-bottom': this.options.vSpace + 'px' })
      this.htmlDoms.bar_area.css({ width: this.options.barSize.width, height: this.options.barSize.height, 'line-height': this.options.barSize.height })
    },

    //绘制合成的图片
    drawImg: function (obj, img) {
      //准备canvas环境
      var canvas = this.$element.find('canvas')[0]
      //var canvas=document.getElementById("myCanvas");
      var ctx = canvas.getContext('2d')

      // 绘制图片
      ctx.drawImage(img, 0, 0, parseInt(this.setSize.img_width), parseInt(this.setSize.img_height))

      // 绘制水印
      var fontSizeArr = ['italic small-caps bold 20px microsoft yahei', 'small-caps normal 25px arial', '34px microsoft yahei']
      var fontStr = '天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩体率宾归王' //不重复的汉字

      var fontChars = []

      var avg = Math.floor(parseInt(this.setSize.img_width) / (parseInt(this.options.defaultNum) + 1))
      var tmp_index = ''
      var color2Num = Math.floor(Math.random() * 5)

      for (var i = 1; i <= this.options.defaultNum; i++) {
        fontChars[i - 1] = this.getChars(fontStr, fontChars)

        tmp_index = Math.floor(Math.random() * 3)
        ctx.font = fontSizeArr[tmp_index]
        ctx.fillStyle = _code_color2[color2Num]

        if (Math.floor(Math.random() * 2) == 1) {
          var tmp_y = Math.floor(parseInt(this.setSize.img_height) / 2) + tmp_index * 20 + 20
        } else {
          var tmp_y = Math.floor(parseInt(this.setSize.img_height) / 2) - tmp_index * 20
        }

        ctx.fillText(fontChars[i - 1], avg * i, tmp_y)
        this.fontPos[i - 1] = { char: fontChars[i - 1], x: avg * i, y: tmp_y }
      }

      for (var i = 0; i < this.options.defaultNum - this.options.checkNum; i++) {
        this.shuffle(this.fontPos).pop()
      }

      var msgStr = ''
      for (var i = 0; i < this.fontPos.length; i++) {
        msgStr += this.fontPos[i].char + ','
      }

      this.htmlDoms.msg.text('请顺序点击【' + msgStr.substring(0, msgStr.length - 1) + '】')

      return this.fontPos
    },

    //获取坐标
    getMousePos: function (obj, event) {
      var e = event || window.event
      var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft
      var scrollY = document.documentElement.scrollTop || document.body.scrollTop
      var x = e.clientX - ($(obj).offset().left - $(window).scrollLeft())
      var y = e.clientY - ($(obj).offset().top - $(window).scrollTop())

      return { x: x, y: y }
    },

    //递归去重
    getChars: function (fontStr, fontChars) {
      var tmp_rand = parseInt(Math.floor(Math.random() * fontStr.length))
      if (tmp_rand > 0) {
        tmp_rand = tmp_rand - 1
      }

      tmp_char = fontStr.charAt(tmp_rand)
      if ($.inArray(tmp_char, fontChars) == -1) {
        return tmp_char
      } else {
        return Points.prototype.getChars(fontStr, fontChars)
      }
    },

    //洗牌数组
    shuffle: function (arr) {
      var m = arr.length,
        i
      while (m) {
        i = (Math.random() * m--) >>> 0
        ;[arr[m], arr[i]] = [arr[i], arr[m]]
      }
      return arr
    },

    //创建坐标点
    createPoint: function (pos) {
      this.htmlDoms.img_panel.append(
        '<div class="point-area" style="background-color:#1abd6c;color:#fff;z-index:9999;width:30px;height:30px;text-align:center;line-height:30px;border-radius: 50%;position:absolute;top:' + parseInt(pos.y - 10) + 'px;left:' + parseInt(pos.x - 10) + 'px;">' + this.num + '</div>'
      )
      return ++this.num
    },

    //比对坐标点
    comparePos: function (fontPos, checkPosArr) {
      var flag = true
      for (var i = 0; i < fontPos.length; i++) {
        if (!(parseInt(checkPosArr[i].x) + 40 > fontPos[i].x && parseInt(checkPosArr[i].x) - 40 < fontPos[i].x && parseInt(checkPosArr[i].y) + 40 > fontPos[i].y && parseInt(checkPosArr[i].y) - 40 < fontPos[i].y)) {
          flag = false
          break
        }
      }

      return flag
    },

    //刷新
    refresh: function () {
      var _this = this
      this.$element.find('.point-area').remove()
      this.fontPos = []
      this.checkPosArr = []
      this.num = 1

      this.img_rand = Math.floor(Math.random() * this.options.imgName.length) //随机的背景图片
      var img = new Image()
      img.src = 'img/' + this.options.imgName[this.img_rand]

      // 加载完成开始绘制
      $(img).on('load', function (e) {
        this.fontPos = _this.drawImg(_this, this)
      })
    }
  }

  //在插件中使用codeVerify对象
  $.fn.codeVerify = function (options, callbacks) {
    var code = new Code(this, options)
    code.init()
  }

  //在插件中使用slideVerify对象
  $.fn.slideVerify = function (options, callbacks) {
    var slide = new Slide(this, options)
    slide.init()
  }

  //在插件中使用clickVerify对象
  $.fn.pointsVerify = function (options, callbacks) {
    var points = new Points(this, options)
    points.init()
  }
})(jQuery, window, document)
